package br.com.salao.session;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import br.com.salao.ejb.dao.impl.GerencEtapasConfEstabDaoImpl;
import br.com.salao.ejb.util.JpaUtil;
import br.com.salao.entity.Estabelecimento;
import br.com.salao.entity.EtapasConfiguracaoEstabelecimento;
import br.com.salao.entity.GerencEtapaConfigEstabelecimento;

@Stateless
@Remote(GerencEtapasConfiguracaoEstabelecimentoBase.class)
public class GerencEtapasConfiguracaoEstabelecimentoBean implements GerencEtapasConfiguracaoEstabelecimentoBase{

	/**
	 * @author Dri
	 */
	private static final long serialVersionUID = 1L;
	
	@PersistenceContext(unitName = "SalaoBeleza")
	private EntityManager em;
	
	private List<GerencEtapaConfigEstabelecimento> listGerencEtapaConfigEstab;
	private GerencEtapaConfigEstabelecimento gerencEtapaConfigEstabelecimento;
	private List<EtapasConfiguracaoEstabelecimento> listaEtapasConfiguracaoEstab;
	
	private Logger logger = Logger.getLogger(GerencEtapasConfiguracaoEstabelecimentoBean.class.getName());

	public GerencEtapasConfiguracaoEstabelecimentoBean(){
		init();
	}

	public void init() {
		//em = JpaUtil.getEntityManager();
	}

	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public List<GerencEtapaConfigEstabelecimento> buscarGerencEtapaConfigEstabPorIdEstabelecimento(int idEstabelecimento){
		GerencEtapasConfEstabDaoImpl dao = new GerencEtapasConfEstabDaoImpl(em);
		return dao.buscarGerencEtapaConfigEstabPorIdEstabelecimento(idEstabelecimento);			
	}
	
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public List<GerencEtapaConfigEstabelecimento> buscarGerencEtapaConfigEstabPorIdBairro(int idBairro){
		GerencEtapasConfEstabDaoImpl dao = new GerencEtapasConfEstabDaoImpl(em);
		return dao.buscarGerencEtapaConfigEstabPorIdBairro(idBairro);	
	}

	@TransactionAttribute
	public List<GerencEtapaConfigEstabelecimento> inserirEtapasPorEstab(Estabelecimento estabelecimento, int idEtapaConfiguracao){
		
		EtapasConfiguracaoEstabelecimentoBean model = new EtapasConfiguracaoEstabelecimentoBean();
		listaEtapasConfiguracaoEstab = model.listar();
		GerencEtapasConfEstabDaoImpl dao;
		GerencEtapaConfigEstabelecimento etapasConfiguracaoPorEstabelecimento;
		List<GerencEtapaConfigEstabelecimento> list = new ArrayList<GerencEtapaConfigEstabelecimento>();
		
		try{

			for(EtapasConfiguracaoEstabelecimento ece : listaEtapasConfiguracaoEstab){				
				

				//GerencEtapasConfiguracaoEstabelecimentoModel model = new GerencEtapasConfiguracaoEstabelecimentoModel();				
				gerencEtapaConfigEstabelecimento = new GerencEtapaConfigEstabelecimento();

				gerencEtapaConfigEstabelecimento.setEtapaConfiguracao(ece);

				if(ece.getNumetapa() == idEtapaConfiguracao){
					gerencEtapaConfigEstabelecimento.setEtapaConcluida(true);
				}else{
					gerencEtapaConfigEstabelecimento.setEtapaConcluida(false);
				}

				gerencEtapaConfigEstabelecimento.setEstabelecimento(estabelecimento);
				
				em = JpaUtil.getEntityManager();
				dao = new GerencEtapasConfEstabDaoImpl(em);
				etapasConfiguracaoPorEstabelecimento = dao.inserir(gerencEtapaConfigEstabelecimento);

				list.add(etapasConfiguracaoPorEstabelecimento);				
			}
			return list;	
		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getMessage());
			sb.append(e.getCause());
			
			logger.error(sb.toString());
			
			e.printStackTrace();
			
			return null;
		}
	}

	@TransactionAttribute
	public boolean updateEtapasPorEstab(Estabelecimento estabelecimento, int idEtapaConfiguracao){

		GerencEtapasConfEstabDaoImpl dao;
		List<GerencEtapaConfigEstabelecimento> listEtapaConf = buscarGerencEtapaConfigEstabPorIdEstabelecimento(estabelecimento.getId());
	
		try{	
		
			for(GerencEtapaConfigEstabelecimento configEstabelecimento : listEtapaConf){
				
				if(configEstabelecimento.getEtapaConfiguracao().getNumetapa() == idEtapaConfiguracao){
					configEstabelecimento.setEtapaConcluida(true);		
					dao = new GerencEtapasConfEstabDaoImpl(em);
					dao.update(configEstabelecimento);
				}		
			}
			
	
		}catch (Exception e) {
			
			StringBuffer sb = new StringBuffer();
			sb.append(e.getMessage());
			sb.append(e.getCause());
			
			logger.error(sb.toString());
			
			e.printStackTrace();
			return false;
		}

		return true;
	}
	
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public boolean verificaSeTodasConfigEfetuadas(int idEstabeleicmento){
		
		//Verifica se todas as configuracoes basicas foram efetuadas

		EtapasConfiguracaoEstabelecimentoBean configuracaoEstabelecimentoModel = new EtapasConfiguracaoEstabelecimentoBean();
		List<EtapasConfiguracaoEstabelecimento> listTodasEtapas = configuracaoEstabelecimentoModel.listar();

		GerencEtapasConfiguracaoEstabelecimentoBean gerencEtapasConfiguracaoEstabelecimentoModel = new GerencEtapasConfiguracaoEstabelecimentoBean();
		List<GerencEtapaConfigEstabelecimento> listEtapasRealizadas = gerencEtapasConfiguracaoEstabelecimentoModel.buscarGerencEtapaConfigEstabPorIdEstabelecimento(idEstabeleicmento);

		int count = 0;
		for(GerencEtapaConfigEstabelecimento configEstabelecimento :listEtapasRealizadas){
			if(configEstabelecimento.isEtapaConcluida() == true){
				++count;
			}
		}		

		if(listTodasEtapas.size() > count){
			return false;
		}else{
			return true;
		}
		
	}

	@TransactionAttribute
	public GerencEtapaConfigEstabelecimento update(GerencEtapaConfigEstabelecimento configEstabelecimento) {
		GerencEtapasConfEstabDaoImpl dao = new GerencEtapasConfEstabDaoImpl(em);
		return dao.update(configEstabelecimento);
	}
	
	@TransactionAttribute
	public GerencEtapaConfigEstabelecimento inserir(GerencEtapaConfigEstabelecimento gerencEtapaConfigEstabelecimento) {
		GerencEtapasConfEstabDaoImpl dao = new GerencEtapasConfEstabDaoImpl(em);
		return dao.inserir(gerencEtapaConfigEstabelecimento);
	}
	
	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public void listarEtapasConfEstabelecimento(){
		EtapasConfiguracaoEstabelecimentoBean model = new EtapasConfiguracaoEstabelecimentoBean();
		listaEtapasConfiguracaoEstab = model.listar();
	}	

	public GerencEtapaConfigEstabelecimento getGerencEtapaConfigEstabelecimento() {
		return gerencEtapaConfigEstabelecimento;
	}

	public void setGerencEtapaConfigEstabelecimento(
			GerencEtapaConfigEstabelecimento gerencEtapaConfigEstabelecimento) {
		this.gerencEtapaConfigEstabelecimento = gerencEtapaConfigEstabelecimento;
	}

	public List<GerencEtapaConfigEstabelecimento> getListGerencEtapaConfigEstab() {
		return listGerencEtapaConfigEstab;
	}

	public void setListGerencEtapaConfigEstab(
			List<GerencEtapaConfigEstabelecimento> listGerencEtapaConfigEstab) {
		this.listGerencEtapaConfigEstab = listGerencEtapaConfigEstab;
	}

	public List<EtapasConfiguracaoEstabelecimento> getListaEtapasConfiguracaoEstab() {
		return listaEtapasConfiguracaoEstab;
	}

	public void setListaEtapasConfiguracaoEstab(
			List<EtapasConfiguracaoEstabelecimento> listaEtapasConfiguracaoEstab) {
		this.listaEtapasConfiguracaoEstab = listaEtapasConfiguracaoEstab;
	}

}
